﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Data.SQLite;
using MySql.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Design;
using Classes;


namespace Classes.cadastro
{
    /*
     int Valor = 803;
     string Formato1 = String.Format("{0:C}", Valor); //Moeda
     string Formato2 = String.Format("{0:C8}", Valor); //Moeda com 8 casas decimais
     string Formato3 = String.Format("{0:D}", Valor); //Decimal
     string Formato4 = String.Format("{0:D15}", Valor); //Decimal com 15 posições (vai zeros a frente p/ completar as posições)
     string Formato5 = String.Format("{0:E}", Valor); //Exponencial XXX.XXXe+xxx
     string Formato6 = String.Format("{0:F}", Valor); //Ponto Fixo
     string Formato7 = String.Format("{0:G}", Valor); //Formato Geral ou Científico
     string Formato8 = String.Format("{0:N}", Valor); //Numérico
     string Formato9 = String.Format("{0:N7}", Valor); //Numérico com 7 casas decimais
     string Formato10 = String.Format("{0:X}", Valor); //Representação Hexadecimal
     string Formato11 = String.Format("{0:x}", Valor); //Representação Hexadecimal também
 
     long CNPJ = 05662546000135;
     string CNPJFormatado = String.Format(@"{0:00\.000\.000\/0000\-00}", CNPJ); //Formatar de Long para CNPJ
 
     long RG = 305617853;
     string RGFormatado = String.Format(@"{0:00\.000\.000\-0}", RG);
    */

    public enum Estado
    {
        Navegacao,
        Inclusao,
        Incluso,
        Alteracao,
        Alterado,
        Confirmacao
    };

    /* Delegado do evento de validação de dados */
    public delegate Boolean ValidacaoDadosEventHandler(object source, EventArgs e);

    /* Delegado do evento de mudança de estado */
    public delegate Boolean EstadoChangeEventHandler(Estado e);

    public class ClassCadastro
    {


        /* INICIO - Evento de validação de dados */
        public event ValidacaoDadosEventHandler OnValidacaoDados;

        /* INICIO - Evento de mudança de estado */
        public event EstadoChangeEventHandler OnEstadoChange;

        /* INICIO - Evento de validação de dados */
        public virtual Boolean OnValidaDados(EventArgs e)
        {
            if (OnValidacaoDados != null)
                return OnValidacaoDados(this, e);
            else
                return true;
        }
        /* FIM - Evento de validação de dados */


        /* INICIO - Evento de mudança de estado */
        public virtual Boolean OnMudaEstado(Estado e)
        {
            if (OnEstadoChange != null)
                return OnEstadoChange(this.vEstado);
            else 
                return true;
        }
        /* FIM - Evento de validação de dados */

        

        /* Variaveis SQL */
        public string sSQL = "";
        public string Tabela;
        public string CondicaoPadrao = "";
        //public string JOIN = "";
        public string StrConn = "";
        public string Ordem = "";
        public string Chave = "";
        /* FIM - Variaveis SQL */

        /* Variaveis de Componente de DB */
        public SQLiteConnection SqlCon = new SQLiteConnection();
        //public SqlConnection SqlCon = new SqlConnection();//System.Configuration.ConfigurationSettings.AppSettings["SivModeloConnectionString"].ToString());
        //public SqlCeConnection SqlCon = new SqlCeConnection("Data Source=|DataDirectory|SIVModelo.sdf");//new SqlConnection("Data Source=localhost;Initial Catalog=SivModelo;Persist Security Info=True;User ID=sa;Password=doom");//System.Configuration.ConfigurationSettings.AppSettings["SivModeloConnectionString"].ToString());
        //public SqlCommand cmd;
        public SQLiteCommand cmd;
        public DataSet ds;
        public DataTable dataTable;
        /* FIM - Variaveis de Componente de DB */

        /* Variaveis de controle de tela */
        public Estado vEstado;
        public ToolTip ToolTip1 = new System.Windows.Forms.ToolTip();
        public Button btnIncluir;
        public Button btnAlterar;
        public Button btnExcluir;
        public Button btnConfirmar;
        public Button btnCancelar;
        public Button btnPesquisar;
        public Button btnRel;
        public Button btnSair;
        public DataGridView grdDados;
        public TabControl tbControl;
        public TabPage tpFiltros;
        public TabPage tpDados;
        public Form FrmPadrao;
        /* FIM Variaveis de controle de tela */

        /**/
        //private string Estado { get; set; }


        /* Lista de Campos */
        public List<Campo> Campos;

        /* Lista de Colunas */
        public List<Coluna> Colunas;

        /* Lista de Join */
        public List<Join> Joins;

        /* Lista de Filtros */
        public List<Filtro> Filtros;

        /* INICIO - PRINCIPAL - Adiciona um novo Campo a lista */
        private void addCampoP(string pNome, string pField, object pComponente, string[] pValores, LookupCombo plookup = null, Boolean pChave = false, Boolean pInserir = true, Boolean pAlterar = true, Boolean pObrigatorio = false)
        {
            Campo cm = new Campo();
            cm.Nome = pNome;
            cm.Field = pField;
            cm.Componente = pComponente;
            cm.chave = pChave;
            cm.inserir = pInserir;
            cm.alterar = pAlterar;
            cm.valores = pValores;
            cm.obrigatorio = pObrigatorio;

            if (plookup != null)
                cm.lookup = plookup;

            if (cm.Componente is DateTimePicker)
            {
                cm.DataFormato = (cm.Componente as DateTimePicker).Format;
                (cm.Componente as DateTimePicker).ValueChanged += new EventHandler(AcertoFormato_ValueChanged);
                (cm.Componente as DateTimePicker).Format = DateTimePickerFormat.Custom;
                (cm.Componente as DateTimePicker).CustomFormat = " ";
            }
            Campos.Add(cm);
        }
        /* FIM - PRINCIPAL - Adiciona um novo Campo a lista */


        /* Adiciona um novo Campo a lista */
        public void addCampo(string pNome, string pField, object pComponente, int pValor, Boolean pObrigatorio = false, Boolean pChave = false, Boolean pInserir = true, Boolean pAlterar = true)
        {
            addCampoP(pNome, pField, pComponente, null, null, pChave, pInserir, pAlterar, pObrigatorio);
        }
        /* FIM - Adiciona um novo Campo a lista */

        /* Adiciona um novo Campo a lista */
        public void addCampo(string pNome, string pField, object pComponente, string[] pValores, Boolean pObrigatorio = false, Boolean pChave = false, Boolean pInserir = true, Boolean pAlterar = true)
        {
            addCampoP(pNome, pField, pComponente, pValores, null, pChave, pInserir, pAlterar, pObrigatorio);
        }
        /* FIM - Adiciona um novo Campo a lista */

        /* Adiciona um novo Campo a lista */
        public void addCampo(string pNome, string pField, object pComponente, Boolean pObrigatorio = true, Boolean pChave = false, Boolean pInserir = true, Boolean pAlterar = true)
        {
            addCampoP(pNome, pField, pComponente, null, null, pChave, pInserir, pAlterar, pObrigatorio);
        }
        /* FIM - Adiciona um novo Campo a lista */


        /* Adiciona um novo Campo com lookup a lista */
        public void addCampo(string pNome, string pField, object pComponente, LookupCombo pLookup, Boolean pObrigatorio = true, Boolean pInserir = true, Boolean pAlterar = true, Boolean pChave = false)
        {
            addCampoP(pNome, pField, pComponente, null, pLookup, pChave, pInserir, pAlterar, pObrigatorio);
        }
        /* FIM - Adiciona um novo Campo com lookup a lista */


        /* Adiciona uma nova Coluna a lista */
        public void addColuna(string pNome, string pField, int pLargura, string pFormato, Boolean pVisivel = true)
        {
            Coluna cl = new Coluna();
            cl.Nome = pNome;
            cl.Field = pField;
            cl.largura = pLargura;
            cl.visivel = pVisivel;
            cl.formato = pFormato;

            Colunas.Add(cl);
        }
        /* FIM - Adiciona uma nova Coluna a lista */


        /* Adiciona uma nova Coluna a lista */
        public void addColuna(string pNome, string pField, int pLargura, Boolean pVisivel = true)
        {
            addColuna(pNome, pField, pLargura, "", pVisivel);
        }
        /* FIM - Adiciona uma nova Coluna a lista */

        
        /* Adiciona um novo Join a lista */
        public void addJoin(string pTabela, string pJoin, string pWhere = "")
        {
            Join join = new Join();
            join.Tabela = pTabela;
            join.JoinIn = pJoin;
            join.Where = pWhere;

            Joins.Add(join);
        }
        /* FIM - Adiciona um novo Join a lista */



        /* Adiciona um novo Filtro a lista */
        public void addFiltro(object pComponente, string pField, string pTipo)
        {
            Filtro flt = new Filtro();
            flt.Componente = pComponente;
            flt.Field = pField;
            flt.Tipo = pTipo;
            flt.Condicao = null;

            Filtros.Add(flt);
        }
        /* FIM - Adiciona um novo Filtro a lista */


        /* Adiciona um novo Filtro a lista */
        public void addFiltro(object pComponente, string pField, string pTipo, Object pCondicao)
        {
            Filtro flt = new Filtro();
            flt.Componente = pComponente;
            flt.Field = pField;
            flt.Tipo = pTipo;
            flt.Condicao = pCondicao;

            Filtros.Add(flt);
        }
        /* FIM - Adiciona um novo Filtro a lista */

        /* Adiciona um novo Filtro a lista */
        public void addFiltro(object pComponente, string pField, string pTipo, string[] pValores, Object pCondicao)
        {
            Filtro flt = new Filtro();
            flt.Componente = pComponente;
            flt.Field = pField;
            flt.Tipo = pTipo;
            flt.Condicao = pCondicao;
            flt.Valores = pValores;

            Filtros.Add(flt);
        }
        /* FIM - Adiciona um novo Filtro a lista */

        /* INICIO - Eventos do DateTimePicker */
        private void AcertoFormato_ValueChanged(object sender, System.EventArgs e)
        {
            foreach (Campo campo in Campos)
            {
                if (campo.Componente == sender)
                    (sender as DateTimePicker).Format = campo.DataFormato;
            }
        }

        private void AcertoFormato_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                foreach (Campo campo in Campos)
                {
                    if (campo.Componente == sender)
                    {
                        (campo.Componente as DateTimePicker).Format = DateTimePickerFormat.Custom;
                        (campo.Componente as DateTimePicker).CustomFormat = " ";
                    }
                }
            }
        }
        /* FIM - Eventos do DateTimePicker */

        
        /* Estado dos botões */
        public void carregaBotoes(string status)
        {
            //Estado = status.ToUpper();

            if ((status.ToUpper() == "I") | (status.ToUpper() == "A"))
            {
                btnIncluir.Enabled = false;
                btnAlterar.Enabled = false;
                btnExcluir.Enabled = false;
                btnConfirmar.Enabled = true;
                btnCancelar.Enabled = true;
                btnPesquisar.Enabled = false;
                btnSair.Enabled = false;
                tbControl.TabPages.Remove(tpFiltros);
                tbControl.TabPages.Remove(tpDados);
                tbControl.TabPages.Add(tpDados);
            }
            else if (status.ToUpper() == "P")
            {
                btnIncluir.Enabled = true;
                btnAlterar.Enabled = true;
                btnExcluir.Enabled = true;
                btnConfirmar.Enabled = false;
                btnCancelar.Enabled = false;
                btnPesquisar.Enabled = true;
                btnSair.Enabled = true;
                tbControl.TabPages.Remove(tpFiltros);
                tbControl.TabPages.Remove(tpDados);
                tbControl.TabPages.Add(tpFiltros);
            }
        }


        /* Botão inclusão */
        protected void btnIncluir_OnClick(object _sender, EventArgs _args)
        {
            vEstado = Estado.Inclusao;
            OnMudaEstado(this.vEstado);
            carregaBotoes("I");
            AlterarStatusCampos("I");
        }

        /* Botão alterar */
        protected void btnAlterar_OnClick(object _sender, EventArgs _args)
        {
            if (grdDados.Rows.Count <= 0)
            {
                MessageBox.Show("Não há registro para alteração.", "Alteração");
                return;
            }
            vEstado = Estado.Alteracao;
            OnMudaEstado(this.vEstado);
            carregar();
            carregaBotoes("A");
            AlterarStatusCampos("A");
            foreach (Campo campo in Campos)
            {
                if (campo.lookup != null)
                {
                    campo.lookup.Localiza((campo.Componente as TextBox).Text);
                }
            }

        }

        /* Botão Excluir */
        protected void btnExcluir_OnClick(object _sender, EventArgs _args)
        {
            if (MessageBox.Show("Deseja realmente excluir o registro selecionado?", "Confirmação de exclusão", MessageBoxButtons.YesNo) == DialogResult.Yes) 
                Excluir();
        }

        /* Botão Confirmar */
        protected void btnConfirmar_OnClick(object _sender, EventArgs _args)
        {
            try
            {
                if (OnValidaDados(new EventArgs()))
                {
                    if (vEstado == Estado.Inclusao)
                    {
                        Incluir();
                        vEstado = Estado.Incluso;
                        OnMudaEstado(this.vEstado);
                    }
                    else if (vEstado == Estado.Alteracao)
                    {
                        Alterar();
                        vEstado = Estado.Alterado;
                        OnMudaEstado(this.vEstado);
                    }

                    carregaBotoes("P");
                    vEstado = Estado.Navegacao;
                    OnMudaEstado(this.vEstado);
                }
            }
            catch (Exception ee) 
            {
                if (MessageBox.Show("Erro na confirmação dos dados.\nErro: " + ee.Message + "\nDesenha cancelar a operação e fechar a tela?", "Erro na confirmação", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    carregaBotoes("P");
                }
            }
        }

        /* Botão Confirmar */
        protected void btnSair_OnClick(object _sender, EventArgs _args)
        {
            FrmPadrao.Close();
        }

        /* Botão Cancelar */
        protected void btnCancelar_OnClick(object _sender, EventArgs _args)
        {
             carregaBotoes("P");
             vEstado = Estado.Navegacao;
             OnMudaEstado(this.vEstado);
        }

        /* Botão Relatório */
        protected void btnRel_OnClick(object _sender, EventArgs _args)
        {
             //
        }
        
        /* Botão Pesquisar */
        protected void btnPesquisar_OnClick(object _sender, EventArgs _args)
        {
            vEstado = Estado.Navegacao;
            OnMudaEstado(this.vEstado);
            carregaBotoes("P");
            grdDados.DataSource = pesquisar(getSQL());        
        }
        
        /* Prepara os componentes visuais da tela */
        public void Preparar() 
        {
            SqlCon.ConnectionString = string.Format("Data Source={0};Version=3;",StrConn);
            Console.Write(SqlCon.ConnectionString);
            /* Prepara os botões */
            // Incluir
            btnIncluir.Click += new EventHandler(btnIncluir_OnClick);
            btnIncluir.Image = global::Classes.Properties.Resources.add_32;
            btnIncluir.Text = "";
            ToolTip1.SetToolTip(btnIncluir, "Incluir um novo registro."); 

            // Alterar
            btnAlterar.Click += new EventHandler(btnAlterar_OnClick);
            btnAlterar.Image = global::Classes.Properties.Resources.edit_32;
            btnAlterar.Text = "";
            ToolTip1.SetToolTip(btnAlterar, "Alterar um registro."); 
            
            // Excluir
            btnExcluir.Click += new EventHandler(btnExcluir_OnClick);
            btnExcluir.Image = global::Classes.Properties.Resources.delete_32_4;
            btnExcluir.Text = "";
            ToolTip1.SetToolTip(btnExcluir, "Excluir o registro"); 

            // Confirmar
            btnConfirmar.Click += new EventHandler(btnConfirmar_OnClick);
            btnConfirmar.Image = global::Classes.Properties.Resources.confirm_32_2;
            btnConfirmar.Text = "";
            ToolTip1.SetToolTip(btnConfirmar, "Confirmação dos dados"); 

            // Cancelar
            btnCancelar.Click += new EventHandler(btnCancelar_OnClick);
            btnCancelar.Image = global::Classes.Properties.Resources.cancel_32;
            btnCancelar.Text = "";
            ToolTip1.SetToolTip(btnCancelar, "Cancelar operação"); 

            // Pesquisar
            btnPesquisar.Click += new EventHandler(btnPesquisar_OnClick);
            btnPesquisar.Image = global::Classes.Properties.Resources.search_32;
            btnPesquisar.Text = "";
            ToolTip1.SetToolTip(btnPesquisar, "Pesquisar dados"); 

            // Rel
            btnRel.Click += new EventHandler(btnRel_OnClick);
            btnRel.Image = global::Classes.Properties.Resources.rel_32_2;
            btnRel.Text = "";
            ToolTip1.SetToolTip(btnRel, "Listagem"); 
            
            // Sair
            btnSair.Click += new EventHandler(btnSair_OnClick);
            btnSair.Image = global::Classes.Properties.Resources.exit_128;
            btnSair.Text = "";
            ToolTip1.SetToolTip(btnSair, "Sair");
            /* FIM - Prepara os botões */

            /* Atribui o evento de validação dos dados digitados */
            this.OnValidacaoDados += new ValidacaoDadosEventHandler(CadastroValidacao);

            //this.OnEstadoChange += new EstadoChangeEventHandler(Estado);
            

            /* Prepara o Grid */
            grdDados.AutoSize = false;
            foreach (Coluna coluna in Colunas)
            {
                DataGridViewColumn dgvc = new DataGridViewTextBoxColumn();

                if (coluna.visivel)
                    dgvc.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;

                dgvc.Visible = coluna.visivel;


                dgvc.DataPropertyName = coluna.Field;
                dgvc.Name = coluna.Nome;
                dgvc.Width = coluna.largura;

                /* Formata coluna Currency */
                if (coluna.formato == ",0.00")
                    dgvc.DefaultCellStyle.Format = "n";
                else if (coluna.formato == "R,0.00")
                    dgvc.DefaultCellStyle.Format = "c";
                else
                    dgvc.DefaultCellStyle.Format = coluna.formato;
                //dgvc.HeaderCell.Style.Alignment = DataGridViewContentAlignment.TopRight;
                //dgvc.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;

                grdDados.Columns.Add(dgvc);
            }

            int i = 0;
            foreach (Campo campo in Campos)
            {
                if (campo.Componente is TextBox)
                {
                    (campo.Componente as TextBox).CharacterCasing = CharacterCasing.Upper;
                    (campo.Componente as TextBox).TabIndex = i;
                }
                else if (campo.Componente is CheckBox)
                    (campo.Componente as CheckBox).TabIndex = i;
                else if (campo.Componente is DateTimePicker)
                    (campo.Componente as DateTimePicker).TabIndex = i;
                else if (campo.Componente is CurrencyEdit)
                    (campo.Componente as CurrencyEdit).TabIndex = i;
                else if (campo.Componente is ComboBox)
                    (campo.Componente as ComboBox).TabIndex = i;
                else if (campo.Componente is MaskedTextBox)
                    (campo.Componente as MaskedTextBox).TabIndex = i;


                if (campo.lookup != null)
                    if (campo.Componente is TextBox)
                        (campo.Componente as TextBox).Leave += new EventHandler(OnExitCampoLookup);

                i++;
            }
            
            i = 0;
            foreach (Filtro filtro in Filtros)
            {
                if (filtro.Componente is TextBox)
                {
                    (filtro.Componente as TextBox).CharacterCasing = CharacterCasing.Upper;
                    (filtro.Componente as TextBox).TabIndex = i;
                }
                else if (filtro.Componente is CheckBox)
                    (filtro.Componente as CheckBox).TabIndex = i;
                else if (filtro.Componente is DateTimePicker)
                    (filtro.Componente as DateTimePicker).TabIndex = i;
                else if (filtro.Componente is CurrencyEdit)
                    (filtro.Componente as CurrencyEdit).TabIndex = i;
                else if (filtro.Componente is ComboBox)
                    (filtro.Componente as ComboBox).TabIndex = i;
                else if (filtro.Componente is MaskedTextBox)
                    (filtro.Componente as MaskedTextBox).TabIndex = i;

                i++;
            }
        }
        /* FIM - Prepara os componentes visuais da tela */


        /* INICIO - Valida o preenchimento dos campos */
        public Boolean CadastroValidacao(Object sender, EventArgs e)
        {
            foreach (Campo campo in Campos)
            {
                if ((campo.obrigatorio) && (((campo.inserir) && (vEstado == Estado.Inclusao)) || ((campo.alterar) && (vEstado == Estado.Alteracao))))
                {
                    if (campo.Componente is CurrencyEdit) {
                        if ((campo.Componente as CurrencyEdit).Value <= 0)
                        {
                            MessageBox.Show("Campo obrigatório não preenchido.\nPreencha o campo " + campo.Nome + ".");
                            (campo.Componente as CurrencyEdit).Focus();
                            return false;
                        }
                    }
                    else if (campo.Componente is ComboBox)
                    {
                        if ((campo.Componente as ComboBox).SelectedItem == null  )
                        {
                             MessageBox.Show("Campo obrigatório não preenchido.\nPreencha o campo " + campo.Nome + ".");
                             (campo.Componente as ComboBox).Focus();
                             return false;
                        }
                    }
                    else if (campo.Componente is DateTimePicker)
                    {
                        if (((campo.Componente as DateTimePicker).Format == DateTimePickerFormat.Custom) && (campo.Componente as DateTimePicker).CustomFormat.Trim() == "")
                        {
                            MessageBox.Show("Campo obrigatório não preenchido.\nPreencha o campo " + campo.Nome + ".");
                            (campo.Componente as DateTimePicker).Focus();
                            return false;
                        }
                    }
                    else if (campo.Componente is TextBox)
                    {
                        if ((campo.Componente as TextBox).Text.Trim() == "")
                        {
                            MessageBox.Show("Campo obrigatório não preenchido.\nPreencha o campo " + campo.Nome + ".");
                            (campo.Componente as TextBox).Focus();
                            return false;
                        }
                    }
                }
            }
            return true;
        }
        /* FIM - Valida o preenchimento dos campos */


        /* INICIO - Controla os dados do campo e do lookup */
        private void OnExitCampoLookup(object sender, System.EventArgs e)
        {
            if (sender is TextBox) 
            {
                if ((sender as TextBox).Text.Trim() != "") 
                {
                    foreach (Campo campo in Campos) 
                    { 
                        if (campo.Componente == sender) 
                        {
                            campo.lookup.Localiza((sender as TextBox).Text);
                        }
                    }
                }
            }
        }
        /* FIM - Controla os dados do campo e do lookup */


        /* Construtor */
        public ClassCadastro() {
            Campos = new List<Campo>();
            Colunas = new List<Coluna>();
            Filtros = new List<Filtro>();
            Joins = new List<Join>();
        }
        /* FIM - Construtor */
        

        /* INICIO - Destrutor */
        ~ClassCadastro()
        {
            try
            {
                if (SqlCon.State != ConnectionState.Closed)
                    SqlCon.Close();
            }
            catch { }
        }
        /* FIM - Destrutor */


        /* INICIO - Processo de pesquisa simples */
        public DataTable pesquisar(string pSQL) 
        {
            /* Verifica o comando */
            if (pSQL != "")
                sSQL = pSQL;

            try
            {
                
                if (SqlCon.State == ConnectionState.Closed)
                    SqlCon.Open();
                cmd = new SQLiteCommand(sSQL, SqlCon);
                ds = new DataSet();

                /* Executa a query */
                SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
                dataTable = new DataTable();

                /* faz o retorno dentro do dataset */
                da.Fill(dataTable);
                da.Dispose();
                return dataTable;
            }
            catch (Exception e)
            {
                MessageBox.Show("Erro ao pesquisar dados.\r\nErro-> " + e.Message, "Erro",
                                 MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return null;
            }
            /*finally
            {
                SqlCon.Close();
            }*/
        }
        /* FIM - processo de pesquisa simples */


        /* INICIO - Monta o SQL de pesquisa */
        public string getSQL() 
        {
            string retorno = "SELECT ";
            int i = 0;

            if (Chave != "")
            {
                retorno += Chave + " as chave";
                i++;
            }

            /* Campos do select */
            foreach (Coluna coluna in Colunas)
            {
                if (i == 0)
                    retorno += coluna.Field;
                else
                    retorno += "," + coluna.Field;
                i++;
            }

            /* FROM e WHERE padrão */
            retorno += " FROM " + Tabela;

            foreach (Join join in Joins)
                if (join.Tabela.Trim() != "")
                    retorno += " " + join.Tabela;

            /* JOIN padrão */
            //if (JOIN.Trim() != "")
            //   retorno += JOIN;
            foreach (Join join in Joins)
                retorno += " " + join.JoinIn;


            retorno += " WHERE 1=1";

            /* Condição Padrão */
            if (CondicaoPadrao.Trim() != "")
                retorno += " AND " + CondicaoPadrao;

            foreach (Join join in Joins)
                if (join.Where.Trim() != "")
                    retorno += " AND " + join.Where;

            Boolean Filtra = false;

            /* Outras condições */
            foreach (Filtro filtro in Filtros)
            {
                /* Verifica se existe condição para o filtro */
                if (filtro.Condicao != null)
                {
                    if (filtro.Condicao is CheckBox)
                    {
                        if (!(filtro.Condicao as CheckBox).Checked)
                        {
                            Filtra = true;
                        }
                    }
                }
                else
                    Filtra = true;

                
                /* Inteiro */
                if ((filtro.Tipo == "int") && ((filtro.Componente as TextBox).Text.Trim() != "") && (Filtra)) 
                    retorno += " AND " + filtro.Field + " = " + (filtro.Componente as TextBox).Text;
                /* Caracter */
                else if ((filtro.Tipo == "char") && ((filtro.Componente as TextBox).Text.Trim() != "") && (Filtra)) 
                    retorno += " AND " + filtro.Field + " like '" + (filtro.Componente as TextBox).Text+"'";
                /* Data */
                else if ((filtro.Tipo == "date") && ((filtro.Componente as TextBox).Text.Trim() != "") && (Filtra)) 
                    retorno += " AND " + filtro.Field + " = '" + (filtro.Componente as TextBox).Text + "'";
                /* Chk */
                else if ((filtro.Tipo == "chk") && (Filtra))
                {
                    if ((filtro.Componente as CheckBox).Checked)
                        retorno += " AND " + filtro.Field + " = '" + filtro.Valores[0] + "'";
                    else
                        retorno += " AND " + filtro.Field + " = '" + filtro.Valores[1] + "'";
                }
                /* Data Inicial e Final */
                else if (((filtro.Tipo == "dateIni") || (filtro.Tipo == "dateFim")) && (Filtra))
                {
                    String Cond = "";

                    if (filtro.Tipo == "dateIni")
                        Cond = " >= ";
                    else
                        Cond = " <= ";

                    if (filtro.Componente is TextBox)
                    {
                        if ((filtro.Componente as TextBox).Text.Trim() != "")
                        {
                            retorno += " AND " + filtro.Field + Cond + " '" + (filtro.Componente as TextBox).Text + "'";
                        }
                    }
                    else if (filtro.Componente is DateTimePicker)
                    {
                        if ((filtro.Componente as DateTimePicker).Value.ToShortDateString().Trim() != "")
                        {
                            retorno += " AND " + filtro.Field + Cond + " '" + (filtro.Componente as DateTimePicker).Value.ToShortDateString().Trim() + "'";
                        }
                    }
                }                    
                Filtra = false;
            }

            if (Ordem.Trim() != "")
                retorno += " ORDER BY " + Ordem;

            return retorno;
        }
        /* FIM - Monta o SQL de pesquisa */


        /* INICIO - Processo de inclusão */
        public void Incluir() 
        {

            string iSQL = "INSERT INTO " + Tabela + " (";
            int i = 0;

             /* Campos */
            foreach (Campo campo in Campos)
            {
                /*Sequencial*/
                if ((campo.chave) && (campo.inserir == false) && (campo.obrigatorio))
                {
                    string strSel = "SELECT IfNULL(MAX(" + campo.Field + "),0)+1 MAX FROM " + Tabela;
                    DataTable dtMax = pesquisar(strSel);
                    (campo.Componente as TextBox).Text = dtMax.Rows[0]["MAX"].ToString();
                }

                if (((campo.inserir) || (campo.chave)) || ((campo.inserir == false) && (campo.obrigatorio)))
                {
                    if (i>0)
                        iSQL += ", " + campo.Field;
                    else
                        iSQL += campo.Field;
                    i++;
                }
            }
            iSQL += ") ";

            i = 0;
            iSQL += "VALUES (";
            /* Parametros */
            foreach (Campo campo in Campos)
            {
                if (((campo.inserir) || (campo.chave)) || ((campo.inserir == false) && (campo.obrigatorio)))
                {
                    if (i > 0)
                        iSQL += ", "; //+ campo.Field;
                   // else
                   //     iSQL += "" + campo.Field;

                    if  (campo.Componente is TextBox)
                        iSQL +=" '"+     (campo.Componente as TextBox).Text.Trim()+"' ";
                    else if (campo.Componente is MaskedTextBox)
                        iSQL +=" '"+     (campo.Componente as MaskedTextBox).Text.Trim()+"' ";
                    else if (campo.Componente is DateTimePicker)
                    iSQL +=" '"+     (campo.Componente as DateTimePicker).Text.Trim()+"' ";


                    i++;
                }
            }
            iSQL += ") ";

            /* Executa o SQL */
            try
            {
                SQLiteParameter uParam;
                //SqlCon.Close();
                cmd = new SQLiteCommand(iSQL, SqlCon);
                /* Adiciona os parametros no command */
                //foreach (Campo campo in Campos)
                //{
                //    //new SQLiteParameter("@uNavnParam", SqlDbType.Text)
                //    if (((campo.inserir) || (campo.chave)) || ((campo.inserir == false) && (campo.obrigatorio)))
                //    {
                //       // var uParam;
                //        if (campo.Componente is CurrencyEdit)
                //            /* Campo Currency/Double/Float */
                //            uParam = new SQLiteParameter("@" + campo.Field, SqlDbType.Float);
                //            //cmd.Parameters.Add("@" + campo.Field,  SqlDbType.Float);
                //        else if (campo.Componente is DateTimePicker)
                //            /* Campo Data */
                //            uParam = new SQLiteParameter("@" + campo.Field, SqlDbType.DateTime);
                //           // cmd.Parameters.Add("@" + campo.Field, SqlDbType.DateTime);
                //        else
                //            /* Campo Texto */
                //            uParam = new SQLiteParameter("@" + campo.Field, SqlDbType.VarChar);
                //         //   cmd.Parameters.Add("@" + campo.Field, SqlDbType.VarChar);

                //            cmd.Parameters.Add(uParam);

                //        if (campo.Componente is CurrencyEdit)
                //            /* Campo Currency/Double/Float */
                //            cmd.Parameters["@" + campo.Field].Value = (campo.Componente as CurrencyEdit).Value;
                //        /* Campo Checkbox */
                //        else if (campo.Componente is CheckBox)
                //        {
                //            if ((campo.Componente as CheckBox).Checked)
                //                cmd.Parameters["@" + campo.Field].Value = campo.valores[0];
                //            else
                //                cmd.Parameters["@" + campo.Field].Value = campo.valores[1];
                //        }
                //        /* ComboBox */
                //        else if (campo.Componente is ComboBox)
                //            cmd.Parameters["@" + campo.Field].Value = (campo.Componente as ComboBox).SelectedItem;
                //        else if (campo.Componente is TextBox)
                //            /* Campo Texto */
                //            cmd.Parameters["@" + campo.Field].Value = (campo.Componente as TextBox).Text.Trim();
                //        else if (campo.Componente is MaskedTextBox)
                //            cmd.Parameters["@" + campo.Field].Value = (campo.Componente as MaskedTextBox).Text.Trim();
                //        else if (campo.Componente is DateTimePicker)
                //            /* Campo Data */
                //            cmd.Parameters["@" + campo.Field].Value = (campo.Componente as DateTimePicker).Value;
                //        //cmd.Parameters.

                //    }
                //}

                if (SqlCon.State == ConnectionState.Closed)
                    SqlCon.Open();
                /* Executa o comando */
                cmd.ExecuteNonQuery();

            }
            catch (Exception e)
            {
                MessageBox.Show("Erro ao inserir dados.\r\nErro-> " + e.Message, "Erro",
                                 MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
        /* FIM - Processo de inclusão */


        /* INICIO - Processo de Alteração */
        public void Alterar()
        {
            string aSQL = "UPDATE " + Tabela ;
            int i = 0;

            aSQL += " SET ";

            /* Campos */
            foreach (Campo campo in Campos)
            {
                if (campo.alterar)
                {
                    if (i > 0)
                        aSQL += ", " + campo.Field + " = @" + campo.Field;
                    else
                        aSQL += campo.Field + " = @" + campo.Field;
                    i++;
                }
            }
            aSQL += " FROM " + Tabela;

            /* WHERE */
            i = 0;
            foreach (Campo campo in Campos)
            {
                if (campo.chave)
                {
                    if (i > 0)
                        aSQL += " AND " + campo.Field + " = @Chave" + campo.Field;
                    else
                        aSQL += " WHERE " + campo.Field + " = @Chave" + campo.Field;
                    i++;
                }
            }

            /* Executa o SQL */
            try
            {
                //SqlCon.Close();
                cmd = new SQLiteCommand(aSQL, SqlCon);
                SQLiteParameter uParam;
                /* Adiciona os parametros no command */
                foreach (Campo campo in Campos)
                {
                    if (campo.alterar)
                    {

                        /* Campo Currency/Double/Float */
                        if (campo.Componente is CurrencyEdit)
                        {
                           // cmd.Parameters.Add("@" + campo.Field, SqlDbType.Float);
                            uParam = new SQLiteParameter("@" + campo.Field, SqlDbType.Float);
                            cmd.Parameters.Add(uParam);
                            cmd.Parameters["@" + campo.Field].Value = (campo.Componente as CurrencyEdit).Value;
                        }
                        /* Campo Checkbox */
                        else if (campo.Componente is CheckBox)
                        {
                            //cmd.Parameters.Add("@" + campo.Field, SqlDbType.VarChar);
                            uParam = new SQLiteParameter("@" + campo.Field, SqlDbType.VarChar);
                            cmd.Parameters.Add(uParam);
                            if ((campo.Componente as CheckBox).Checked)
                                cmd.Parameters["@" + campo.Field].Value = campo.valores[0];
                            else
                                cmd.Parameters["@" + campo.Field].Value = campo.valores[1];
                        }
                        /* ComboBox */
                        else if (campo.Componente is ComboBox)
                        {
                            //cmd.Parameters.Add("@" + campo.Field, SqlDbType.VarChar);
                            uParam = new SQLiteParameter("@" + campo.Field, SqlDbType.VarChar);
                            cmd.Parameters.Add(uParam);
                            if ((campo.Componente as ComboBox).SelectedItem.ToString().IndexOf('=') > 0)
                                cmd.Parameters["@" + campo.Field].Value = (campo.Componente as ComboBox).SelectedItem.ToString().Substring(0, ((campo.Componente as ComboBox).SelectedItem.ToString().IndexOf('=')));
                            else
                                cmd.Parameters["@" + campo.Field].Value = (campo.Componente as ComboBox).SelectedItem;
                        }
                        /* Campo Texto */
                        else if (campo.Componente is TextBox)
                        {
                            //cmd.Parameters.Add("@" + campo.Field, SqlDbType.VarChar);
                            uParam = new SQLiteParameter("@" + campo.Field, SqlDbType.VarChar);
                            cmd.Parameters.Add(uParam);
                            cmd.Parameters["@" + campo.Field].Value = (campo.Componente as TextBox).Text;
                        }
                        /* Campo Data */
                        else if (campo.Componente is DateTimePicker)
                        {
                            //cmd.Parameters.Add("@" + campo.Field, SqlDbType.DateTime);
                            uParam = new SQLiteParameter("@" + campo.Field, SqlDbType.DateTime);
                            cmd.Parameters.Add(uParam);
                            cmd.Parameters["@" + campo.Field].Value = (campo.Componente as DateTimePicker).Value;
                        }
                    }

                    if (campo.chave) 
                    {
                        //cmd.Parameters.Add("@Chave" + campo.Field, SqlDbType.VarChar);
                        uParam = new SQLiteParameter("@" + campo.Field, SqlDbType.VarChar);
                        cmd.Parameters.Add(uParam);
                        /* Campo Texto */
                        if (campo.Componente is TextBox)
                            cmd.Parameters["@Chave" + campo.Field].Value = (campo.Componente as TextBox).Text;
                    }
                }

                if (SqlCon.State == ConnectionState.Closed)
                    SqlCon.Open();
                /* Executa o comando */
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                MessageBox.Show("Erro ao alterar dados.\r\nErro-> " + e.Message, "Erro",
                                 MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
        /* FIM - Processo de Alteração */


        /* INICIO - Processo de Exclusão */
        public void Excluir()
        {
            string eSQL = "DELETE ";
            int i = 0;
            eSQL += " FROM " + Tabela;

            /* WHERE */
            i = 0;
            foreach (Campo campo in Campos)
            {
                if (campo.chave)
                {
                    if (i > 0)
                        eSQL += " AND " + campo.Field + " = @Chave" + campo.Field;
                    else
                        eSQL += " WHERE " + campo.Field + " = @Chave" + campo.Field;
                    i++;
                }
            }

            /* Executa o SQL */
            try
            {
                //SqlCon.Close();
                cmd = new SQLiteCommand(eSQL, SqlCon);
                SQLiteParameter uParam;
                /* Adiciona os parametros no command */
                foreach (Campo campo in Campos)
                {
                    if (campo.chave)
                    {
                        /* Trata o parametro*/
                        /* INT */
                        if (grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.GetType() == typeof(int))
                        {
                            //cmd.Parameters.Add("@Chave" + campo.Field, SqlDbType.Int);
                            uParam = new SQLiteParameter("@Chave" + campo.Field, SqlDbType.VarChar);
                            cmd.Parameters.Add(uParam);
                            cmd.Parameters["@Chave" + campo.Field].Value = Convert.ToInt32(grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.ToString());
                        }
                        /* INT64 */
                        else if (grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.GetType() == typeof(Int64))
                        {
                            //cmd.Parameters.Add("@Chave" + campo.Field, SqlDbType.BigInt);
                            uParam = new SQLiteParameter("@Chave" + campo.Field, SqlDbType.BigInt);
                            cmd.Parameters.Add(uParam);
                            cmd.Parameters["@Chave" + campo.Field].Value = Convert.ToInt64(grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.ToString());
                        }
                        /* DateTime */
                        else if (grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.GetType() == typeof(DateTime))
                        {
                            //cmd.Parameters.Add("@Chave" + campo.Field, SqlDbType.DateTime);
                            uParam = new SQLiteParameter("@Chave" + campo.Field, SqlDbType.BigInt);
                            cmd.Parameters.Add(uParam);
                            cmd.Parameters["@Chave" + campo.Field].Value = Convert.ToDateTime(grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.ToString());
                        }
                        /* Double */
                        else if (grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.GetType() == typeof(Double))
                        {
                            //cmd.Parameters.Add("@Chave" + campo.Field, SqlDbType.Float);
                            uParam = new SQLiteParameter("@Chave" + campo.Field, SqlDbType.BigInt);
                            cmd.Parameters.Add(uParam);
                            cmd.Parameters["@Chave" + campo.Field].Value = Convert.ToDouble(grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.ToString());
                        }
                        /* String */
                        else if (grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.GetType() == typeof(string))
                        {
                            //cmd.Parameters.Add("@Chave" + campo.Field, SqlDbType.VarChar);
                            uParam = new SQLiteParameter("@Chave" + campo.Field, SqlDbType.BigInt);
                            cmd.Parameters.Add(uParam);
                            cmd.Parameters["@Chave" + campo.Field].Value = grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.ToString();
                        }
                    }
                }

                if (SqlCon.State == ConnectionState.Closed)
                    SqlCon.Open();
                /* Executa o comando */
                cmd.ExecuteNonQuery();

            }
            catch (Exception e)
            {
                MessageBox.Show("Erro ao exluir dados.\r\nErro-> " + e.Message, "Erro",
                                 MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
        /* FIM - Processo de Exclusão */


        /* INICIO - Localiza os dados e carrega os campos */
        public void carregar() 
        {
            BindingSource bs = new BindingSource();
            string cSQL = "SELECT ";
            int i = 0;

            foreach (Campo campo in Campos)
            {
                if (i > 0)
                    cSQL += ", " + campo.Field;
                else
                    cSQL += campo.Field;

                i++;
            }

            cSQL += " FROM " + Tabela;
            /* WHERE */
            i = 0;
            foreach (Campo campo in Campos)
            {
                if (campo.chave)
                {
                    string id = grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.ToString();
                    if (i > 0)
                        cSQL += " AND " + campo.Field + string.Format(" = {0} ", campo.valor);//+ campo.Field;
                    else
                        cSQL += " WHERE " + campo.Field + string.Format(" = {0} ", id);//" = @Chave" + campo.Field;
                    i++;
                }
            }


            /* Executa o SQL */
            try
            {
                //SqlCon.Close();
                cmd = new SQLiteCommand(cSQL, SqlCon);
                SQLiteParameter uParam;
                /* Adiciona os parametros no command */
                //foreach (Campo campo in Campos)
                //{
                //    if (campo.chave)
                //    {
                //        /* Trata o parametro*/
                //        /* INT */
                //        if (grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.GetType() == typeof(int))
                //        {
                //            //cmd.Parameters.Add("@Chave" + campo.Field, SqlDbType.Int);
                //            uParam = new SQLiteParameter("@Chave" + campo.Field, SqlDbType.Int);
                //            cmd.Parameters.Add(uParam);
                //            cmd.Parameters["@Chave" + campo.Field].Value = Convert.ToInt32(grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.ToString());
                //        }
                //        /* INT64 */
                //        else if (grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.GetType() == typeof(Int64))
                //        {
                //            //cmd.Parameters.Add("@Chave" + campo.Field, SqlDbType.BigInt);
                //            uParam = new SQLiteParameter("@Chave" + campo.Field, SqlDbType.BigInt);
                //            cmd.Parameters.Add(uParam);
                //            cmd.Parameters["@Chave" + campo.Field].Value = Convert.ToInt64(grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.ToString());
                //        }
                //        /* DateTime */
                //        else if (grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.GetType() == typeof(DateTime))
                //        {
                //            //cmd.Parameters.Add("@Chave" + campo.Field, SqlDbType.DateTime);
                //            uParam = new SQLiteParameter("@Chave" + campo.Field, SqlDbType.DateTime);
                //            cmd.Parameters.Add(uParam);
                //            cmd.Parameters["@Chave" + campo.Field].Value = Convert.ToDateTime(grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.ToString());
                //        }
                //        /* Double */
                //        else if (grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.GetType() == typeof(Double))
                //        {
                //           // cmd.Parameters.Add("@Chave" + campo.Field, SqlDbType.Float);
                //            uParam = new SQLiteParameter("@Chave" + campo.Field, SqlDbType.Float);
                //            cmd.Parameters.Add(uParam);
                //            cmd.Parameters["@Chave" + campo.Field].Value = Convert.ToDouble(grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.ToString());
                //        }
                //        /* String */
                //        else if (grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.GetType() == typeof(string))
                //        {
                //            //cmd.Parameters.Add("@Chave" + campo.Field, SqlDbType.VarChar);
                //            uParam = new SQLiteParameter("@Chave" + campo.Field, SqlDbType.VarChar);
                //            cmd.Parameters.Add(uParam);
                //            cmd.Parameters["@Chave" + campo.Field].Value = grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.ToString();
                //        }

                //    }
                //}

                if (SqlCon.State == ConnectionState.Closed)
                    SqlCon.Open();
                /* Executa o comando */
                //cmd.ExecuteReader();
                ds = new DataSet();

                /* Executa a query */
                SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
                dataTable = new DataTable();

                /* faz o retorno dentro do dataset */
                da.Fill(dataTable);
                da.Dispose();

                //SqlCon.Close();

                //bs.DataSource = dataTable;
                i = 0;
                foreach (Campo campo in Campos)
                {
                    if (campo.Componente is CurrencyEdit)
                    {
                        (campo.Componente as CurrencyEdit).Value = Convert.ToDouble( dataTable.Rows[0][campo.Field].ToString() );
                    }
                    else if (campo.Componente is CheckBox)
                    {
                        if (dataTable.Rows[0][campo.Field].ToString() == campo.valores[0])
                            (campo.Componente as CheckBox).Checked = true;
                        else
                            (campo.Componente as CheckBox).Checked = false;
                    }
                    else if (campo.Componente is DateTimePicker)
                    {
                        if (dataTable.Rows[0][campo.Field].ToString().Trim() != "")
                        {
                           //  (campo.Componente as DateTimePicker).Format = campo.DataFormato;
                            

                            (campo.Componente as DateTimePicker).Value = DateTime.Parse(dataTable.Rows[0][campo.Field].ToString());
                        }
                    }
                    else if (campo.Componente is ComboBox)
                    {
                        //(campo.Componente as ComboBox).FindString(dataTable.Rows[0][campo.Field].ToString());
                        (campo.Componente as ComboBox).SelectedIndex = -1;
                        (campo.Componente as ComboBox).Text = dataTable.Rows[0][campo.Field].ToString();
                        if ((campo.Componente as ComboBox).Items[0].ToString().IndexOf("=") > 0)
                            (campo.Componente as ComboBox).SelectedIndex = (campo.Componente as ComboBox).FindString(dataTable.Rows[0][campo.Field].ToString(), -1);
                    }
                    else if (campo.Componente is TextBox)
                    {
                        (campo.Componente as TextBox).Text = dataTable.Rows[0][campo.Field].ToString();
                    }


                    i++;
                }

            }
            catch (Exception e)
            {
                MessageBox.Show("Erro ao localizar dados.\r\nErro-> " + e.Message, "Erro",
                                 MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
        /* FIM - Localiza os dados e carrega os campos */


        /* INICIO - Retorno o index de uma coluna do grid */
        public int getIndice(string sFieldName) {

            foreach (Campo campo in Campos)
            {
                int i = 0;
                if (campo.Field == sFieldName)
                    return i;
                i++;
            }
            return -1;
        }
        /* FIM - Retorno o index de uma coluna do grid */


        /* INICIO - Altera o estado de utilização do campo em tela */
        public void AlterarStatusCampos(string status) 
        {
            foreach (Campo campo in Campos)
            {
                /* Inclusão */
                if (status.ToUpper() == "I") 
                {
                    if (campo.inserir)
                        (campo.Componente as Control).Enabled = true;
                    else
                    {
                        (campo.Componente as Control).Enabled = false;
                        if (campo.Componente is DateTimePicker)
                            (campo.Componente as DateTimePicker).Value = DateTime.Now;
                    }

                    if (campo.Componente is CurrencyEdit)
                        (campo.Componente as CurrencyEdit).Value = 0;
                    else if (campo.Componente is CheckBox)
                        (campo.Componente as CheckBox).Checked = false;
                    else if (campo.Componente is TextBox)
                        (campo.Componente as TextBox).Clear();
                    else if (campo.Componente is MaskedTextBox)
                        (campo.Componente as MaskedTextBox).Clear();
                    else if ((campo.Componente is DateTimePicker) && ((campo.Componente as Control).Enabled))
                    {
                        (campo.Componente as DateTimePicker).CustomFormat = " ";
                        (campo.Componente as DateTimePicker).Format = DateTimePickerFormat.Custom;
                    }
                }
                /* Alteração */
                else if (status.ToUpper() == "A")
                {
                    if (campo.alterar)
                    {
                        (campo.Componente as Control).Enabled = true;

                        if (campo.lookup != null)
                            (campo.lookup.Campo as Control).Enabled = true;
                    }
                    else
                    {
                        (campo.Componente as Control).Enabled = false;
                        if (campo.lookup != null)
                            (campo.lookup.Campo as Control).Enabled = false;
                    }

                }

                if (campo.Componente is DateTimePicker)
                {
                    if (!(campo.Componente as Control).Enabled)
                        (campo.Componente as DateTimePicker).Format = campo.DataFormato;
                }

            }  
        }
        /* FIM - Altera o estado de utilização do campo em tela */



        /* Retorna o valor dos campos chaves do registro selecionado */
        public string GetConteudoChave()
        {
            string retorno = "";
            if ((vEstado == Estado.Incluso) || (vEstado == Estado.Alterado))
            {
                foreach (Campo campo in Campos)
                {
                    /*Sequencial*/
                    if (campo.chave)
                        retorno = (campo.Componente as TextBox).Text;
                }
            }
            else
            {
                if (grdDados.RowCount > 0)
                {
                    /* Preenche o retorno */
                    foreach (Campo campo in Campos)
                    {
                        if (campo.chave)
                            retorno = grdDados.CurrentRow.Cells[getIndice(campo.Field)].Value.ToString();
                    }
                }
            }
            return retorno;
        }


    }
}
